home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_551 / toolmanager / source / editwindow.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  40KB  |  1,149 lines

  1. /*
  2.  * editwindow.c   V1.5
  3.  *
  4.  * edit window
  5.  *
  6.  * (c) 1991 by Stefan Becker
  7.  *
  8.  */
  9. #include "ToolManager.h"
  10.  
  11. /* Structures for window */
  12. static char WindowTitle[]="Edit Tool Definition";        /* 1. Window title */
  13. static char IP1WindowTitle[]="Press right mouse button"; /* 2. Window title */
  14. static char IP2WindowTitle[]="Position, then release";   /* 3. Window title */
  15. extern struct NewWindow nw;
  16. static struct Window *w;
  17. static struct MsgPort *wp;
  18. static ULONG wh;             /* Window height */
  19. static struct Screen *pubsc; /* Workbench screen */
  20.  
  21. /* Structures for window gadgets */
  22. static void *vi;             /* Visual information is a *PRIVATE* data field! */
  23. extern struct GfxBase *GfxBase;
  24. static struct TextAttr ta={NULL,0,0,0};
  25. static struct Gadget *gl;    /* Gadget list */
  26. #define TOGAD_ID  1
  27. static char *ToolLabelTexts[]={"Dummy","CLI","WB",NULL};
  28. #define OTGAD_ID  2
  29. static struct Gadget *otcg;
  30. #define ALGAD_ID  3
  31. extern char AliasKey[];
  32. static struct Gadget *alsg;
  33. #define RBGAD_ID  4
  34. extern char RealKey[];
  35. static struct Gadget *rnbg;
  36. #define RNGAD_ID  5
  37. static struct Gadget *rnsg;
  38. #define WBGAD_ID  6
  39. static char WDButtonText[]="WorkDir";
  40. static struct Gadget *wdbg;
  41. #define WDGAD_ID  7
  42. static struct Gadget *wdsg;
  43. #define PBGAD_ID  8
  44. static char PAButtonText[]="Path";
  45. static struct Gadget *pabg;
  46. #define PAGAD_ID  9
  47. static struct Gadget *pasg;
  48. #define OBGAD_ID 10
  49. static char OFButtonText[]="OutFile";
  50. static struct Gadget *ofbg;
  51. #define OFGAD_ID 11
  52. static struct Gadget *ofsg;
  53. #define STGAD_ID 12
  54. extern char StackKey[];
  55. static struct Gadget *stig;
  56. #define HKGAD_ID 13
  57. extern char HotKKey[];
  58. static struct Gadget *hksg;
  59. #define MNGAD_ID 14
  60. static struct Gadget *mncg;
  61. #define ARGAD_ID 15
  62. static struct Gadget *arcg;
  63. #define WFGAD_ID 16
  64. static struct Gadget *wfcg;
  65. #define ICGAD_ID 17
  66. static struct Gadget *iccg;
  67. #define INGAD_ID 18
  68. static struct Gadget *incg;
  69. #define ITGAD_ID 19
  70. extern char BrushKey[];
  71. extern char DObjKey[];
  72. static char *IconLabelTexts[]={BrushKey,DObjKey,NULL};
  73. static struct Gadget *itcg;
  74. #define IBGAD_ID 20
  75. extern char IFileKey[];
  76. static struct Gadget *ifbg;
  77. #define IFGAD_ID 21
  78. static struct Gadget *ifsg;
  79. #define IXGAD_ID 22
  80. static struct Gadget *ixig;
  81. #define IYGAD_ID 23
  82. static struct Gadget *iyig;
  83. #define IPGAD_ID 24
  84. static struct Gadget *ipbg;
  85. static BOOL DoPositioning;
  86. static BOOL NewPosition;
  87. #define DOGAD_ID 25
  88. static struct Gadget *docg;
  89. #define SIGAD_ID 26
  90. static struct Gadget *sicg;
  91. #define DTGAD_ID 27
  92. static struct Gadget *dtcg;
  93. #define DBGAD_ID 28
  94. extern char DFileKey[];
  95. static struct Gadget *dfbg;
  96. #define DFGAD_ID 29
  97. static struct Gadget *dfsg;
  98. #define OKGAD_ID 30
  99. #define CAGAD_ID 31
  100. static struct Gadget *curg;     /* Current active string gadget */
  101.  
  102. /* miscellaneous */
  103. extern WORD lvord;
  104. static struct ToolNode *etn;    /* Pointer to edit tool node */
  105. static struct ConfigBlock *cb;  /* Pointer to config block */
  106.  
  107. /* Create config block */
  108. static BOOL GetConfigBlock(struct ToolNode *tn)
  109. {
  110.  if (!(cb=malloc(sizeof(struct ConfigBlock)))) return(FALSE);
  111.  
  112.  /* Init config block */
  113.  InitConfigBlock(cb);
  114.  
  115.  /* Copy tools parameters */
  116.  cb->cb_Type=tn->tn_Type;
  117.  cb->cb_Flags=tn->tn_Flags;
  118.  cb->cb_Stack=tn->tn_Stack;
  119.  strcpy(cb->cb_Alias,tn->tn_Node.ln_Name);
  120.  if (tn->tn_RealName) strcpy(cb->cb_RealName,tn->tn_RealName);
  121.  if (tn->tn_WorkDir) strcpy(cb->cb_WorkDir,tn->tn_WorkDir);
  122.  if (tn->tn_Path) strcpy(cb->cb_Path,tn->tn_Path);
  123.  if (tn->tn_OutFile) strcpy(cb->cb_OutFile,tn->tn_OutFile);
  124.  if (tn->tn_HotKey) strcpy(cb->cb_HotKey,tn->tn_HotKey);
  125.  if (tn->tn_IconFile) strcpy(cb->cb_IconFile,tn->tn_IconFile);
  126.  if (tn->tn_DockFile) strcpy(cb->cb_DockFile,tn->tn_DockFile);
  127.  if (tn->tn_Icon)
  128.   {
  129.    cb->cb_IconX=tn->tn_Icon->do_CurrentX;
  130.    cb->cb_IconY=tn->tn_Icon->do_CurrentY;
  131.   }
  132.  
  133.  /* All OK */
  134.  return(TRUE);
  135. }
  136.  
  137. /* Create gadgets */
  138. static BOOL CreateGadgets(ULONG *width)
  139. {
  140.  struct NewGadget ng;
  141.  struct Gadget *g;
  142.  struct TextFont *f;
  143.  UWORD topborder,leftedge,leftstring,fheight;
  144.  UWORD fwidth,wg,wbg,wsg;
  145.  BOOL dummy=cb->cb_Type==TNTYPE_DUMMY;
  146.  BOOL ncli=cb->cb_Type!=TNTYPE_CLI;
  147.  BOOL nicon=dummy || !(cb->cb_Flags&TNFLAGS_ICON);
  148.  BOOL ndock=dummy || !(cb->cb_Flags&TNFLAGS_DOCK);
  149.  
  150.  if (!(f=OpenFont(pubsc->Font))) goto cge1; /* Open window font */
  151.  topborder=pubsc->WBorTop+f->tf_YSize+1;    /* Top border offset */
  152.  CloseFont(f);                              /* Close font */
  153.  
  154.  f=GfxBase->DefaultFont;                    /* System Default Font */
  155.  ta.ta_Name=f->tf_Message.mn_Node.ln_Name;
  156.  ta.ta_YSize=f->tf_YSize;
  157.  fheight=f->tf_YSize+INTERHEIGHT;           /* font height */
  158.  fwidth=f->tf_XSize;                        /* font width */
  159.  
  160.  /* Create gadget list */
  161.  gl=NULL;
  162.  g=CreateContext(&gl);
  163.  
  164.  /* Calculate window values */
  165.  leftedge=pubsc->WBorLeft+INTERWIDTH;
  166.  wbg=8*fwidth+INTERWIDTH;
  167.  leftstring=8*fwidth+pubsc->WBorLeft+3*INTERWIDTH;
  168.  wg=30*fwidth+pubsc->WBorLeft+13*INTERWIDTH;
  169.  if (wg>*width) *width=wg;
  170.  wsg=*width-leftstring+INTERWIDTH+INTERWIDTH/2;
  171.  
  172.  /*  1. gadget: Cycle, Tool type */
  173.  ng.ng_LeftEdge=leftstring;
  174.  ng.ng_TopEdge=topborder+INTERHEIGHT;
  175.  ng.ng_Width=6*fwidth+3*INTERWIDTH;
  176.  ng.ng_Height=fheight;
  177.  ng.ng_GadgetText="Type    ";
  178.  ng.ng_TextAttr=&ta;
  179.  ng.ng_GadgetID=TOGAD_ID;
  180.  ng.ng_Flags=PLACETEXT_LEFT;
  181.  ng.ng_VisualInfo=vi;
  182.  ng.ng_UserData=NULL;
  183.  if (!(g=CreateGadget(CYCLE_KIND,g,&ng,
  184.                       GTCY_Labels,ToolLabelTexts,
  185.                       GTCY_Active,cb->cb_Type,
  186.                       TAG_DONE)))
  187.   goto cge2;
  188.  
  189.  /*  2. gadget: CheckBox, Output */
  190.  ng.ng_LeftEdge+=g->Width+2*INTERWIDTH;
  191.  ng.ng_Width=10;
  192.  ng.ng_GadgetText="Output";
  193.  ng.ng_GadgetID=OTGAD_ID;
  194.  ng.ng_Flags=PLACETEXT_RIGHT;
  195.  if (!(otcg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  196.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_COUT,
  197.                            GA_Disabled,ncli,
  198.                            TAG_DONE)))
  199.   goto cge2;
  200.  
  201.  /*  3. gadget: String, Alias */
  202.  ng.ng_LeftEdge=leftstring;
  203.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  204.  ng.ng_Width=wsg;
  205.  ng.ng_Height=fheight+2;
  206.  ng.ng_GadgetText=AliasKey;
  207.  ng.ng_GadgetID=ALGAD_ID;
  208.  ng.ng_Flags=PLACETEXT_LEFT;
  209.  if (!(alsg=g=CreateGadget(STRING_KIND,g,&ng,
  210.                            GTST_String,cb->cb_Alias,
  211.                            GTST_MaxChars,BUFLEN-1,
  212.                            TAG_DONE)))
  213.   goto cge2;
  214.  
  215.  /*  4. gadget: Button, RealName */
  216.  ng.ng_LeftEdge=leftedge;
  217.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  218.  ng.ng_Width=wbg;
  219.  ng.ng_GadgetText=RealKey;
  220.  ng.ng_GadgetID=RBGAD_ID;
  221.  ng.ng_Flags=PLACETEXT_IN;
  222.  if (!(rnbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  223.                            GA_Disabled,dummy,
  224.                            TAG_DONE)))
  225.   goto cge2;
  226.  
  227.  /*  5. gadget: String, RealName */
  228.  ng.ng_LeftEdge=leftstring;
  229.  ng.ng_Width=wsg;
  230.  ng.ng_GadgetText=NULL;
  231.  ng.ng_GadgetID=RNGAD_ID;
  232.  if (!(rnsg=g=CreateGadget(STRING_KIND,g,&ng,
  233.                            GTST_String,cb->cb_RealName,
  234.                            GTST_MaxChars,BUFLEN-1,
  235.                            GA_Disabled,dummy,
  236.                            TAG_DONE)))
  237.   goto cge2;
  238.  
  239.  /*  6. gadget: Button, WorkDir */
  240.  ng.ng_LeftEdge=leftedge;
  241.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  242.  ng.ng_Width=wbg;
  243.  ng.ng_GadgetText=WDButtonText;
  244.  ng.ng_GadgetID=WBGAD_ID;
  245.  if (!(wdbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  246.                            GA_Disabled,dummy,
  247.                            TAG_DONE)))
  248.   goto cge2;
  249.  
  250.  /*  7. gadget: String, WorkDir */
  251.  ng.ng_LeftEdge=leftstring;
  252.  ng.ng_Width=wsg;
  253.  ng.ng_GadgetText=NULL;
  254.  ng.ng_GadgetID=WDGAD_ID;
  255.  if (!(wdsg=g=CreateGadget(STRING_KIND,g,&ng,
  256.                            GTST_String,cb->cb_WorkDir,
  257.                            GTST_MaxChars,BUFLEN-1,
  258.                            GA_Disabled,dummy,
  259.                            TAG_DONE)))
  260.   goto cge2;
  261.  
  262.  /*  8. gadget: Button, Path */
  263.  ng.ng_LeftEdge=leftedge;
  264.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  265.  ng.ng_Width=wbg;
  266.  ng.ng_GadgetText=PAButtonText;
  267.  ng.ng_GadgetID=PBGAD_ID;
  268.  if (!(pabg=g=CreateGadget(BUTTON_KIND,g,&ng,
  269.                            GA_Disabled,ncli,
  270.                            TAG_DONE)))
  271.   goto cge2;
  272.  
  273.  /*  9. gadget: String, Path */
  274.  ng.ng_LeftEdge=leftstring;
  275.  ng.ng_Width=wsg;
  276.  ng.ng_GadgetText=NULL;
  277.  ng.ng_GadgetID=PAGAD_ID;
  278.  if (!(pasg=g=CreateGadget(STRING_KIND,g,&ng,
  279.                            GTST_String,cb->cb_Path,
  280.                            GTST_MaxChars,BUFLEN-1,
  281.                            GA_Disabled,ncli,
  282.                            TAG_DONE)))
  283.   goto cge2;
  284.  
  285.  /* 10. gadget: String, OutFile */
  286.  ng.ng_LeftEdge=leftedge;
  287.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  288.  ng.ng_Width=wbg;
  289.  ng.ng_GadgetText=OFButtonText;
  290.  ng.ng_GadgetID=OBGAD_ID;
  291.  if (!(ofbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  292.                            GA_Disabled,ncli,
  293.                            TAG_DONE)))
  294.   goto cge2;
  295.  
  296.  /* 11. gadget: String, OutFile */
  297.  ng.ng_LeftEdge=leftstring;
  298.  ng.ng_Width=wsg;
  299.  ng.ng_GadgetText=NULL;
  300.  ng.ng_GadgetID=OFGAD_ID;
  301.  if (!(ofsg=g=CreateGadget(STRING_KIND,g,&ng,
  302.                            GTST_String,cb->cb_OutFile,
  303.                            GTST_MaxChars,BUFLEN-1,
  304.                            GA_Disabled,ncli,
  305.                            TAG_DONE)))
  306.   goto cge2;
  307.  
  308.  /* 12. gadget: Integer, Stack */
  309.  ng.ng_LeftEdge=leftstring;
  310.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  311.  ng.ng_GadgetText=StackKey;
  312.  ng.ng_GadgetID=STGAD_ID;
  313.  ng.ng_Flags=PLACETEXT_LEFT;
  314.  if (!(stig=g=CreateGadget(INTEGER_KIND,g,&ng,
  315.                            GTIN_Number,cb->cb_Stack,
  316.                            GA_Disabled,dummy,
  317.                            TAG_DONE)))
  318.   goto cge2;
  319.  
  320.  /* 13. gadget: String, HotKey */
  321.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  322.  ng.ng_GadgetText=HotKKey;
  323.  ng.ng_GadgetID=HKGAD_ID;
  324.  if (!(hksg=g=CreateGadget(STRING_KIND,g,&ng,
  325.                            GTST_String,cb->cb_HotKey,
  326.                            GTST_MaxChars,BUFLEN-1,
  327.                            GA_Disabled,dummy,
  328.                            TAG_DONE)))
  329.   goto cge2;
  330.  
  331.  /* 14. gadget: CheckBox, Menu */
  332.  ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH;
  333.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  334.  ng.ng_Width=10;
  335.  ng.ng_Height=fheight;
  336.  ng.ng_GadgetText="Menu";
  337.  ng.ng_GadgetID=MNGAD_ID;
  338.  ng.ng_Flags=PLACETEXT_RIGHT;
  339.  if (!(mncg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  340.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_MENU,
  341.                            TAG_DONE)))
  342.   goto cge2;
  343.  
  344.  /* 15. gadget: CheckBox, Args */
  345.  wg=4*fwidth+2*INTERWIDTH;
  346.  ng.ng_LeftEdge+=g->Width+wg;
  347.  ng.ng_GadgetText="Args";
  348.  ng.ng_GadgetID=ARGAD_ID;
  349.  if (!(arcg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  350.                            GTCB_Checked,!(cb->cb_Flags&TNFLAGS_NARG),
  351.                            GA_Disabled,dummy,
  352.                            TAG_DONE)))
  353.   goto cge2;
  354.  
  355.  /* 16. gadget: CheckBox, WBFront */
  356.  ng.ng_LeftEdge+=g->Width+wg;
  357.  ng.ng_GadgetText="WBFront";
  358.  ng.ng_GadgetID=WFGAD_ID;
  359.  if (!(wfcg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  360.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_WBTF,
  361.                            GA_Disabled,dummy,
  362.                            TAG_DONE)))
  363.   goto cge2;
  364.  
  365.  /* 17. gadget: CheckBox, Icon */
  366.  ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH;
  367.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  368.  ng.ng_GadgetText=DObjKey;
  369.  ng.ng_GadgetID=ICGAD_ID;
  370.  if (!(iccg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  371.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_ICON,
  372.                            GA_Disabled,dummy,
  373.                            TAG_DONE)))
  374.   goto cge2;
  375.  
  376.  /* 18. gadget: CheckBox, Name */
  377.  ng.ng_LeftEdge+=g->Width+wg;
  378.  ng.ng_GadgetText="Name";
  379.  ng.ng_GadgetID=INGAD_ID;
  380.  if (!(incg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  381.                            GTCB_Checked,!(cb->cb_Flags&TNFLAGS_NNAM),
  382.                            GA_Disabled,nicon,
  383.                            TAG_DONE)))
  384.   goto cge2;
  385.  
  386.  /* 19. gadget: Cycle, Icon type */
  387.  ng.ng_LeftEdge+=g->Width+wg;
  388.  ng.ng_Width=6*fwidth+3*INTERWIDTH;
  389.  ng.ng_GadgetText="Type   ";
  390.  ng.ng_GadgetID=ITGAD_ID;
  391.  if (!(itcg=g=CreateGadget(CYCLE_KIND,g,&ng,
  392.                            GTCY_Labels,IconLabelTexts,
  393.                            GTCY_Active,(cb->cb_Flags&TNFLAGS_DOBJ)?1:0,
  394.                            GA_Disabled,nicon,
  395.                            TAG_DONE)))
  396.   goto cge2;
  397.  
  398.  /* 20. gadget: String, IconFile */
  399.  ng.ng_LeftEdge=leftedge;
  400.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  401.  ng.ng_Width=wbg;
  402.  ng.ng_Height=fheight+2;
  403.  ng.ng_GadgetText=IFileKey;
  404.  ng.ng_GadgetID=IBGAD_ID;
  405.  ng.ng_Flags=PLACETEXT_IN;
  406.  if (!(ifbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  407.                            GA_Disabled,nicon,
  408.                            TAG_DONE)))
  409.   goto cge2;
  410.  
  411.  /* 21. gadget: String, IconFile */
  412.  ng.ng_LeftEdge=leftstring;
  413.  ng.ng_Width=wsg;
  414.  ng.ng_GadgetText=NULL;
  415.  ng.ng_GadgetID=IFGAD_ID;
  416.  if (!(ifsg=g=CreateGadget(STRING_KIND,g,&ng,
  417.                            GTST_String,cb->cb_IconFile,
  418.                            GTST_MaxChars,BUFLEN-1,
  419.                            GA_Disabled,nicon,
  420.                            TAG_DONE)))
  421.   goto cge2;
  422.  
  423.  /* 22. gadget: Integer, Icon X Position */
  424.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  425.  ng.ng_Width=4*fwidth+2*INTERWIDTH;
  426.  ng.ng_GadgetText="Icon X";
  427.  ng.ng_GadgetID=IXGAD_ID;
  428.  ng.ng_Flags=PLACETEXT_LEFT;
  429.  if (!(ixig=g=CreateGadget(INTEGER_KIND,g,&ng,
  430.                            GTIN_Number,cb->cb_IconX,
  431.                            GA_Disabled,nicon,
  432.                            TAG_DONE)))
  433.   goto cge2;
  434.  
  435.  /* 23. gadget: Integer, Icon Y Position */
  436.  ng.ng_LeftEdge+=g->Width+3*fwidth+2*INTERWIDTH;
  437.  ng.ng_GadgetText="Y";
  438.  ng.ng_GadgetID=IYGAD_ID;
  439.  if (!(iyig=g=CreateGadget(INTEGER_KIND,g,&ng,
  440.                            GTIN_Number,cb->cb_IconY,
  441.                            GA_Disabled,nicon,
  442.                            TAG_DONE)))
  443.   goto cge2;
  444.  
  445.  /* 24. gadget: Button, Icon Positioning */
  446.  ng.ng_LeftEdge+=g->Width+3*INTERWIDTH;
  447.  ng.ng_Width=11*fwidth+INTERWIDTH;
  448.  ng.ng_GadgetText="Positioning";
  449.  ng.ng_GadgetID=IPGAD_ID;
  450.  ng.ng_Flags=PLACETEXT_IN;
  451.  if (!(ipbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  452.                            GA_Disabled,nicon,
  453.                            TAG_DONE)))
  454.   goto cge2;
  455.  DoPositioning=FALSE;
  456.  NewPosition=FALSE;
  457.  
  458.  /* 25. gadget: CheckBox, Dock */
  459.  ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH;
  460.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  461.  ng.ng_GadgetText="Dock";
  462.  ng.ng_GadgetID=DOGAD_ID;
  463.  ng.ng_Flags=PLACETEXT_RIGHT;
  464.  if (!(docg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  465.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_DOCK,
  466.                            GA_Disabled,dummy,
  467.                            TAG_DONE)))
  468.   goto cge2;
  469.  
  470.  /* 26. gadget: CheckBox, Same Icon */
  471.  ng.ng_LeftEdge+=g->Width+wg;
  472.  ng.ng_GadgetText="Same Icon";
  473.  ng.ng_GadgetID=SIGAD_ID;
  474.  if (!(sicg=g=CreateGadget(CHECKBOX_KIND,g,&ng,
  475.                            GTCB_Checked,cb->cb_Flags&TNFLAGS_SICN,
  476.                            GA_Disabled,ndock || nicon,
  477.                            TAG_DONE)))
  478.   goto cge2;
  479.  
  480.  /* 27. gadget: Cycle, Dock type */
  481.  ng.ng_LeftEdge+=g->Width+2*wg;
  482.  ng.ng_Width=6*fwidth+3*INTERWIDTH;
  483.  ng.ng_GadgetText="Type   ";
  484.  ng.ng_GadgetID=DTGAD_ID;
  485.  if (!(dtcg=g=CreateGadget(CYCLE_KIND,g,&ng,
  486.                            GTCY_Labels,IconLabelTexts,
  487.                            GTCY_Active,(cb->cb_Flags&TNFLAGS_DDOB)?1:0,
  488.                            GA_Disabled,ndock || cb->cb_Flags&TNFLAGS_SICN,
  489.                            TAG_DONE)))
  490.   goto cge2;
  491.  
  492.  /* 28. gadget: Button, DockFile */
  493.  ng.ng_LeftEdge=leftedge;
  494.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  495.  ng.ng_Width=wbg;
  496.  ng.ng_Height=fheight+2;
  497.  ng.ng_GadgetText=DFileKey;
  498.  ng.ng_GadgetID=DBGAD_ID;
  499.  ng.ng_Flags=PLACETEXT_IN;
  500.  if (!(dfbg=g=CreateGadget(BUTTON_KIND,g,&ng,
  501.                            GA_Disabled,ndock || cb->cb_Flags&TNFLAGS_SICN,
  502.                            TAG_DONE)))
  503.   goto cge2;
  504.  
  505.  /* 29. gadget: String, DockFile */
  506.  ng.ng_LeftEdge=leftstring;
  507.  ng.ng_Width=wsg;
  508.  ng.ng_GadgetText=NULL;
  509.  ng.ng_GadgetID=DFGAD_ID;
  510.  if (!(dfsg=g=CreateGadget(STRING_KIND,g,&ng,
  511.                            GTST_String,cb->cb_DockFile,
  512.                            GTST_MaxChars,BUFLEN-1,
  513.                            GA_Disabled,ndock || cb->cb_Flags&TNFLAGS_SICN,
  514.                            TAG_DONE)))
  515.   goto cge2;
  516.  
  517.  /* 30. gadget: Button, OK */
  518.  wg=6*fwidth+INTERWIDTH;
  519.  ng.ng_LeftEdge=pubsc->WBorLeft+INTERWIDTH;
  520.  ng.ng_TopEdge+=fheight+INTERHEIGHT;
  521.  ng.ng_Width=wg;
  522.  ng.ng_GadgetText="OK";
  523.  ng.ng_GadgetID=OKGAD_ID;
  524.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cge2;
  525.  
  526.  /* 31. gadget: Button, Cancel */
  527.  ng.ng_LeftEdge=pubsc->WBorLeft+*width-wg+INTERWIDTH;
  528.  ng.ng_GadgetText="Cancel";
  529.  ng.ng_GadgetID=CAGAD_ID;
  530.  if (!(g=CreateGadget(BUTTON_KIND,g,&ng,TAG_DONE))) goto cge2;
  531.  
  532.  /* Calculate window height */
  533.  wh=ng.ng_TopEdge+fheight-topborder+INTERHEIGHT;
  534.  return(TRUE);
  535.  
  536. cge2: FreeGadgets(gl);
  537. cge1: return(FALSE);
  538. }
  539.  
  540. /* Set current string gadget and activate it */
  541. static void SetAndActivateSG(struct Gadget *g)
  542. {
  543.  ActivateGadget(g,w,NULL);
  544.  curg=g;
  545. }
  546.  
  547. /* Open edit window */
  548. void OpenEditWindow(ULONG left, ULONG top, ULONG width, struct ToolNode *tn)
  549. {
  550.  if (!(pubsc=LockPubScreen(WBScreenName))) /* Lock Workbench screen */
  551.   goto oew1;
  552.  
  553.  if (!(vi=GetVisualInfo(pubsc,TAG_DONE))) /* Get visual information */
  554.   goto oew2;
  555.  
  556.  if (!GetConfigBlock(tn))                 /* Get memory for config block */
  557.   goto oew3;
  558.  
  559.  if (!CreateGadgets(&width))              /* Create Gadgets */
  560.   goto oew4;
  561.  
  562.  /* Open window */
  563.  if (!(w=OpenWindowTags(&nw,
  564.                         WA_Left,left-INTERWIDTH,
  565.                         WA_Top,top+20,
  566.                         WA_InnerWidth,width+2*INTERWIDTH,
  567.                         WA_InnerHeight,wh,
  568.                         WA_RMBTrap,TRUE,
  569.                         WA_Title,WindowTitle,
  570.                         WA_PubScreen,pubsc,
  571.                         WA_AutoAdjust,TRUE,
  572.                         TAG_DONE)))
  573.   goto oew5;
  574.  
  575.  wp=w->UserPort; /* Retrieve window port */
  576.  
  577.  /* Add gadget list to window */
  578.  AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  579.  RefreshGList(gl,w,NULL,(UWORD) -1);
  580.  GT_RefreshWindow(w,NULL);
  581.  SetAndActivateSG(alsg);
  582.  
  583.  /* Window open! */
  584.  UnlockPubScreen(NULL,pubsc);
  585.  etn=tn;
  586.  editwinsig=1L<<wp->mp_SigBit;
  587.  globalsigs|=editwinsig;
  588.  return;
  589.  
  590.  /* Something went wrong.... */
  591. oew5: FreeGadgets(gl);
  592. oew4: free(cb);
  593. oew3: FreeVisualInfo(vi);
  594. oew2: UnlockPubScreen(NULL,pubsc);
  595. oew1: return;
  596. }
  597.  
  598. /* Close edit window */
  599. void CloseEditWindow(void)
  600. {
  601.  if (editwinsig)
  602.   {
  603.    CloseWindow(w);
  604.    FreeGadgets(gl);
  605.    free(cb);
  606.    FreeVisualInfo(vi);
  607.    globalsigs&=~editwinsig;
  608.    editwinsig=0;
  609.    StatWinEndEditing();
  610.   }
  611. }
  612.  
  613. /* Handle old icon position */
  614. static void DoOldPosition(void)
  615. {
  616.  if (NewPosition)       /* Has the user choosen a new icon position? */
  617.   {
  618.    /* Yes, remove the new icon */
  619.    if (etn->tn_AppIcon) RemoveAppIcon(etn->tn_AppIcon);
  620.  
  621.    /* Let the old icon re-appear */
  622.    if (etn->tn_Flags&TNFLAGS_ICON)
  623.     {
  624.      /* Old position */
  625.      etn->tn_Icon->do_CurrentX=cb->cb_IconX;
  626.      etn->tn_Icon->do_CurrentY=cb->cb_IconY;
  627.  
  628.      etn->tn_AppIcon=AddAppIconA((ULONG) etn,NULL,
  629.                       (etn->tn_Flags&TNFLAGS_NNAM)?"":etn->tn_Node.ln_Name,
  630.                       MyMP,NULL,etn->tn_Icon,NULL);
  631.     }
  632.   }
  633. }
  634.  
  635. /* Handle new position */
  636. static void DoNewPosition(void)
  637. {
  638.  /* Remove the old icon */
  639.  if (etn->tn_AppIcon) RemoveAppIcon(etn->tn_AppIcon);
  640.  
  641.  /* If an icon exists, move it to the new position */
  642.  if (etn->tn_Flags&TNFLAGS_ICON)
  643.   {
  644.    /* Add the new icon */
  645.    etn->tn_Icon->do_CurrentX=((struct StringInfo *) ixig->SpecialInfo)->LongInt;
  646.    etn->tn_Icon->do_CurrentY=((struct StringInfo *) iyig->SpecialInfo)->LongInt;
  647.  
  648.    etn->tn_AppIcon=AddAppIconA((ULONG) etn,NULL,
  649.                     (etn->tn_Flags&TNFLAGS_NNAM)?"":etn->tn_Node.ln_Name,
  650.                     MyMP,NULL,etn->tn_Icon,NULL);
  651.   }
  652.  
  653.  NewPosition=TRUE;
  654. }
  655.  
  656. /* Read in a file/dir name and update Gadget */
  657. static void SetFileGadget(struct Gadget *g, char *name, int type)
  658. {
  659.  char *cp=((struct StringInfo *) g->SpecialInfo)->Buffer;
  660.  BPTR oldfl;
  661.  
  662.  oldfl=CurrentDir(etn->tn_DirLock);
  663.  if (!ShowFileRequester(w,name,&cp,type))
  664.   {
  665.    /* Update Gadget */
  666.    GT_SetGadgetAttrs(g,w,NULL,GTST_String,cp,TAG_DONE);
  667.  
  668.    free(cp); /* free buffer */
  669.   }
  670.  CurrentDir(oldfl);
  671.  
  672.  ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  673. }
  674.  
  675. /* Handle edit window events */
  676. void HandleEditWinEvent(void)
  677. {
  678.  BOOL clwin=FALSE; /* TRUE if window should be closed */
  679.  struct IntuiMessage *msg;
  680.  
  681.  while ((msg=GT_GetIMsg(wp)) /* && !clwin */)
  682.   {
  683.    switch (msg->Class)
  684.     {
  685.      case IDCMP_MOUSEBUTTONS:   /* User pressed a mouse button */
  686.       /* Icon positioning in progress? */
  687.       if (DoPositioning)
  688.        switch(msg->Code)        /* Which button? */
  689.         {
  690.          case MENUDOWN:         /* User pressed menu button */
  691.           /* Set new window title */
  692.           SetWindowTitles(w,IP2WindowTitle,(UBYTE *) -1);
  693.           break;
  694.  
  695.          case MENUUP:           /* User released menu button */
  696.           /* Yes --> read new coordinates and stop positioning */
  697.           if (pubsc=LockPubScreen(WBScreenName))
  698.            {
  699.             WORD x,y;
  700.             register struct Window *wbwin;
  701.  
  702.             /***************************************/
  703.             /***** WARNING ugly code follows! ******/
  704.             /***************************************/
  705.  
  706.             Forbid(); /* Monotasking */
  707.             wbwin=pubsc->FirstWindow;
  708.  
  709.             /* Find Workbench window */
  710.             while (wbwin)
  711.              {
  712.               if (wbwin->Title!=NULL)
  713.                {
  714.                 /* Workbench window? */
  715.                 if (!strcmp(wbwin->Title,WBScreenName)) break;
  716.                }
  717.               else
  718.                /* Workbench backdrop window? */
  719.                if ((wbwin->Flags&(WFLG_BACKDROP|WFLG_BORDERLESS)==
  720.                     WFLG_BACKDROP|WFLG_BORDERLESS) &&
  721.                    !strcmp(((struct Task *) wbwin->UserPort->mp_SigTask)->
  722.                            tc_Node.ln_Name,WBScreenName))
  723.                 break;
  724.  
  725.               /* Next window */
  726.               wbwin=wbwin->NextWindow;
  727.              }
  728.  
  729.             /* Window found? */
  730.             if (wbwin)
  731.              {
  732.               x=wbwin->GZZMouseX; /* Yes --> retreive Mouse coordinates */
  733.               y=wbwin->GZZMouseY;
  734.              }
  735.  
  736.             Permit(); /* Multitasking */
  737.  
  738.             /***************************************/
  739.             /********** End of ugly code ***********/
  740.             /***************************************/
  741.  
  742.             UnlockPubScreen(NULL,pubsc);
  743.  
  744.             /* Window found? */
  745.             if (wbwin)
  746.              {
  747.               /* Yes --> Set new coordinates */
  748.               GT_SetGadgetAttrs(ixig,w,NULL,GTIN_Number,x,TAG_DONE);
  749.               GT_SetGadgetAttrs(iyig,w,NULL,GTIN_Number,(y<0)?0:y,TAG_DONE);
  750.               DoNewPosition();
  751.              }
  752.            }
  753.  
  754.           /* Stop positioning */
  755.           GT_SetGadgetAttrs(ipbg,w,NULL,GA_Disabled,FALSE,TAG_DONE);
  756.           SetWindowTitles(w,WindowTitle,(UBYTE *) -1);
  757.           DoPositioning=FALSE;
  758.           ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  759.           break;
  760.  
  761.         }
  762.        else
  763.         ActivateGadget(curg,w,NULL);   /* Reactivate old string gadget */
  764.       break;
  765.      case IDCMP_CLOSEWINDOW:    /* User clicked the close gadget */
  766.       clwin=TRUE;               /* Yes, close window */
  767.       DoOldPosition();
  768.       break;
  769.      case IDCMP_REFRESHWINDOW:  /* Window must be refreshed */
  770.       GT_BeginRefresh(w);
  771.       GT_EndRefresh(w,TRUE);
  772.       break;
  773.      case IDCMP_GADGETUP:       /* User released the gadget */
  774.       switch(((struct Gadget *) msg->IAddress)->GadgetID)
  775.        {
  776.         case TOGAD_ID:          /* User selected the Type gadget */
  777.          BOOL dummy,ncli,nicon,ndock,sicon;
  778.  
  779.          /* Set type and status flags */
  780.          cb->cb_Type=msg->Code;
  781.          dummy=cb->cb_Type==TNTYPE_DUMMY;             /* DUMMY tool */
  782.          ncli=cb->cb_Type!=TNTYPE_CLI;                /* No CLI tool */
  783.          nicon=dummy || !(cb->cb_Flags&TNFLAGS_ICON); /* No icon */
  784.          ndock=dummy || !(cb->cb_Flags&TNFLAGS_DOCK); /* No dock */
  785.          sicon=ndock || (cb->cb_Flags&TNFLAGS_SICN);  /* Same icon */
  786.  
  787.          /* (de)activate all other gadgets according to the tool type */
  788.          GT_SetGadgetAttrs(otcg,w,NULL,GA_Disabled,ncli,TAG_DONE);
  789.          GT_SetGadgetAttrs(rnbg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  790.          GT_SetGadgetAttrs(rnsg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  791.          GT_SetGadgetAttrs(wdbg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  792.          GT_SetGadgetAttrs(wdsg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  793.          GT_SetGadgetAttrs(pabg,w,NULL,GA_Disabled,ncli,TAG_DONE);
  794.          GT_SetGadgetAttrs(pasg,w,NULL,GA_Disabled,ncli,TAG_DONE);
  795.          GT_SetGadgetAttrs(ofbg,w,NULL,GA_Disabled,ncli,TAG_DONE);
  796.          GT_SetGadgetAttrs(ofsg,w,NULL,GA_Disabled,ncli,TAG_DONE);
  797.          GT_SetGadgetAttrs(stig,w,NULL,GA_Disabled,dummy,TAG_DONE);
  798.          GT_SetGadgetAttrs(hksg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  799.          GT_SetGadgetAttrs(arcg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  800.          GT_SetGadgetAttrs(wfcg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  801.          GT_SetGadgetAttrs(iccg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  802.          GT_SetGadgetAttrs(incg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  803.          GT_SetGadgetAttrs(itcg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  804.          GT_SetGadgetAttrs(ifbg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  805.          GT_SetGadgetAttrs(ifsg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  806.          GT_SetGadgetAttrs(ixig,w,NULL,GA_Disabled,nicon,TAG_DONE);
  807.          GT_SetGadgetAttrs(iyig,w,NULL,GA_Disabled,nicon,TAG_DONE);
  808.          GT_SetGadgetAttrs(ipbg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  809.          GT_SetGadgetAttrs(docg,w,NULL,GA_Disabled,dummy,TAG_DONE);
  810.          GT_SetGadgetAttrs(sicg,w,NULL,GA_Disabled,ndock,TAG_DONE);
  811.          GT_SetGadgetAttrs(dtcg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  812.          GT_SetGadgetAttrs(dfbg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  813.          GT_SetGadgetAttrs(dfsg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  814.          if (DoPositioning)
  815.           {
  816.            SetWindowTitles(w,WindowTitle,(UBYTE *) -1);
  817.            DoPositioning=FALSE;
  818.           }
  819.  
  820.          /* DUMMY tool? Yes -> Set standard values */
  821.          if (dummy)
  822.           {
  823.            GT_SetGadgetAttrs(mncg,w,NULL,GTCB_Checked,TRUE,TAG_DONE);
  824.            cb->cb_Flags|=TNFLAGS_MENU; /* Don't discard icon flag yet */
  825.  
  826.            /* Next active gadget */
  827.            SetAndActivateSG(alsg);
  828.           }
  829.          else
  830.           ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  831.  
  832.          break;
  833.         case OTGAD_ID:          /* User selected the Output gadget */
  834.          cb->cb_Flags^=TNFLAGS_COUT;  /* Toggle output flag */
  835.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  836.          break;
  837.         case ALGAD_ID:          /* User pressed <return> on Alias gadget */
  838.          if (cb->cb_Type==TNTYPE_DUMMY) /* Activate next gadget */
  839.           SetAndActivateSG(alsg);
  840.          else
  841.           SetAndActivateSG(rnsg);
  842.          break;
  843.         case RBGAD_ID:          /* User selected the RealName button gadget */
  844.          SetFileGadget(rnsg,RealKey,FREQ_FILE);
  845.          break;
  846.         case RNGAD_ID:          /* User pressed <return> on RealName gadget */
  847.          SetAndActivateSG(wdsg); /* Activate next gadget */
  848.          break;
  849.         case WBGAD_ID:          /* User selected the WorkDir button gadget */
  850.          SetFileGadget(wdsg,WDButtonText,FREQ_DIRS);
  851.          break;
  852.         case WDGAD_ID:          /* User pressed <return> on WorkDir gadget */
  853.          if (cb->cb_Type==TNTYPE_CLI) /* Activate next gadget */
  854.           SetAndActivateSG(pasg);
  855.          else
  856.           SetAndActivateSG(stig);
  857.          break;
  858.         case PBGAD_ID:          /* User selected the Path button gadget */
  859.          char *buf;
  860.  
  861.          /* Get memory for path string */
  862.          if (buf=malloc(BUFLEN))
  863.           {
  864.            char *cp=((struct StringInfo *) pasg->SpecialInfo)->Buffer,*tmp;
  865.            BPTR oldfl;
  866.  
  867.            /* Copy old path string to buffer (only first path!) */
  868.            if (tmp=strchr(cp,','))
  869.             strncpy(buf,cp,cp-tmp);
  870.            else
  871.             strcpy(buf,cp);
  872.            cp=buf;
  873.  
  874.            oldfl=CurrentDir(etn->tn_DirLock);
  875.            if (!ShowFileRequester(w,PAButtonText,&cp,FREQ_DIRS))
  876.             {
  877.              int len=strlen(buf);
  878.  
  879.              /* Build new path string */
  880.              if (len>0)
  881.               {
  882.                strncat(buf,",",BUFLEN-1-len); /* Buffer not empty, append "," */
  883.                if ((BUFLEN-1-len)>0) len++;
  884.               }
  885.              strncat(buf,cp,BUFLEN-1-len);    /* Append new name */
  886.              free(cp);                        /* free FREQ buffer */
  887.  
  888.              /* Update Gadget */
  889.              GT_SetGadgetAttrs(pasg,w,NULL,GTST_String,buf,TAG_DONE);
  890.             }
  891.            CurrentDir(oldfl);
  892.            free(buf);
  893.           }
  894.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  895.          break;
  896.         case PAGAD_ID:          /* User pressed <return> on Path gadget */
  897.          SetAndActivateSG(ofsg); /* Activate next gadget */
  898.          break;
  899.         case OBGAD_ID:          /* User selected the OutFile button gadget */
  900.          SetFileGadget(ofsg,OFButtonText,FREQ_FILE);
  901.          break;
  902.         case OFGAD_ID:          /* User pressed <return> on OutFile gadget */
  903.          /* Outfile gadget not empty? */
  904.          if (*(((struct StringInfo *) ofsg->SpecialInfo)->Buffer)!='\0')
  905.           {
  906.            GT_SetGadgetAttrs(otcg,w,NULL,GTCB_Checked,TRUE,TAG_DONE);
  907.            cb->cb_Flags|=TNFLAGS_COUT;
  908.           }
  909.          SetAndActivateSG(stig); /* Activate next gadget */
  910.          break;
  911.         case STGAD_ID:          /* User pressed <return> on Stack gadget */
  912.          SetAndActivateSG(hksg); /* Activate next gadget */
  913.          break;
  914.         case HKGAD_ID:          /* User pressed <return> on HotKey gadget */
  915.          if (cb->cb_Flags&TNFLAGS_ICON) /* Activate next gadget */
  916.           SetAndActivateSG(ifsg);
  917.          else if ((cb->cb_Flags&TNFLAGS_DOCK) && !(cb->cb_Flags&TNFLAGS_SICN))
  918.           SetAndActivateSG(dfsg);
  919.          else
  920.           SetAndActivateSG(alsg);
  921.          break;
  922.         case MNGAD_ID:          /* User selected the Menu gadget */
  923.          cb->cb_Flags^=TNFLAGS_MENU;  /* Toggle menu flag */
  924.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  925.          break;
  926.         case ARGAD_ID:          /* User selected the Args gadget */
  927.          cb->cb_Flags^=TNFLAGS_NARG;  /* Toggle Args flag */
  928.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  929.          break;
  930.         case WFGAD_ID:          /* User selected the WBFront gadget */
  931.          cb->cb_Flags^=TNFLAGS_WBTF;  /* Toggle WBFront flag */
  932.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  933.          break;
  934.         case ICGAD_ID:          /* User selected the Icon gadget */
  935.          BOOL nicon=!(iccg->Flags&SELECTED); /* No icon */
  936.  
  937.          cb->cb_Flags^=TNFLAGS_ICON; /* Toggle icon flag */
  938.  
  939.          /* (de)activate icon parameter gadets according to icon flag state */
  940.          GT_SetGadgetAttrs(incg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  941.          GT_SetGadgetAttrs(itcg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  942.          GT_SetGadgetAttrs(ifbg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  943.          GT_SetGadgetAttrs(ifsg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  944.          GT_SetGadgetAttrs(ixig,w,NULL,GA_Disabled,nicon,TAG_DONE);
  945.          GT_SetGadgetAttrs(iyig,w,NULL,GA_Disabled,nicon,TAG_DONE);
  946.          GT_SetGadgetAttrs(ipbg,w,NULL,GA_Disabled,nicon,TAG_DONE);
  947.          if (DoPositioning)
  948.           {
  949.            SetWindowTitles(w,WindowTitle,(UBYTE *) -1);
  950.            DoPositioning=FALSE;
  951.           }
  952.  
  953.          /* Activate next gadget */
  954.          if (nicon)
  955.           {
  956.            SetAndActivateSG(alsg);
  957.  
  958.            /* Set Dock gadget state */
  959.            GT_SetGadgetAttrs(sicg,w,NULL,GA_Disabled,TRUE,
  960.                                          GTCB_Checked,FALSE,
  961.                                          TAG_DONE);
  962.            cb->cb_Flags&=~TNFLAGS_SICN;
  963.            if (cb->cb_Flags&TNFLAGS_DOCK)
  964.             {
  965.              GT_SetGadgetAttrs(dtcg,w,NULL,GA_Disabled,FALSE,TAG_DONE);
  966.              GT_SetGadgetAttrs(dfbg,w,NULL,GA_Disabled,FALSE,TAG_DONE);
  967.              GT_SetGadgetAttrs(dfsg,w,NULL,GA_Disabled,FALSE,TAG_DONE);
  968.             }
  969.           }
  970.          else
  971.           {
  972.            ActivateGadget(curg,w,NULL);
  973.  
  974.            /* Set Same Icon gadget state */
  975.            if (cb->cb_Flags&TNFLAGS_DOCK)
  976.             GT_SetGadgetAttrs(sicg,w,NULL,GA_Disabled,FALSE,TAG_DONE);
  977.           }
  978.          break;
  979.         case INGAD_ID:          /* User selected the Name gadget */
  980.          cb->cb_Flags^=TNFLAGS_NNAM;  /* Toggle NoName flag */
  981.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  982.          break;
  983.         case ITGAD_ID:          /* User selected the IconType gadget */
  984.          cb->cb_Flags^=TNFLAGS_DOBJ;  /* Toggle icon type flag */
  985.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  986.          break;
  987.         case IBGAD_ID:          /* User selected the IconFile button gadget */
  988.          SetFileGadget(ifsg,IFileKey,FREQ_ICON);
  989.          break;
  990.         case IFGAD_ID:          /* User pressed <return> on IconFile gadget */
  991.          SetAndActivateSG(ixig); /* Activate next gadget */
  992.          break;
  993.         case IXGAD_ID:          /* User pressed <return> on X Coord. gadget */
  994.          DoNewPosition();
  995.          SetAndActivateSG(iyig); /* Activate next gadget */
  996.          break;
  997.         case IYGAD_ID:          /* User pressed <return> on Y Coord. gadget */
  998.          DoNewPosition();
  999.            /* Activate next gadget */
  1000.          if ((cb->cb_Flags&TNFLAGS_DOCK) && !(cb->cb_Flags&TNFLAGS_SICN))
  1001.           SetAndActivateSG(dfsg);
  1002.          else
  1003.           SetAndActivateSG(alsg);
  1004.          break;
  1005.         case IPGAD_ID:          /* User selected the Icon Positioning gadget */
  1006.          GT_SetGadgetAttrs(ipbg,w,NULL,GA_Disabled,TRUE,TAG_DONE);
  1007.          SetWindowTitles(w,IP1WindowTitle,(UBYTE *) -1);
  1008.          DoPositioning=TRUE;          /* Start positioning */
  1009.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  1010.          break;
  1011.         case DOGAD_ID:          /* User selected the Dock gadget */
  1012.          BOOL ndock=!(docg->Flags&SELECTED); /* No dock */
  1013.          BOOL sicon=ndock || (cb->cb_Flags&TNFLAGS_SICN);
  1014.  
  1015.          cb->cb_Flags^=TNFLAGS_DOCK; /* Toggle dock flag */
  1016.  
  1017.          /* (de)activate icon parameter gadets according to icon flag state */
  1018.          GT_SetGadgetAttrs(sicg,w,NULL,
  1019.                            GA_Disabled,ndock || !(cb->cb_Flags&TNFLAGS_ICON),
  1020.                            TAG_DONE);
  1021.          GT_SetGadgetAttrs(dtcg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1022.          GT_SetGadgetAttrs(dfbg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1023.          GT_SetGadgetAttrs(dfsg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1024.  
  1025.          /* Activate next gadget */
  1026.          if (ndock)
  1027.           SetAndActivateSG(alsg);
  1028.          else
  1029.           ActivateGadget(curg,w,NULL);
  1030.          break;
  1031.         case SIGAD_ID:
  1032.          BOOL sicon=sicg->Flags&SELECTED; /* Same icon */
  1033.  
  1034.          cb->cb_Flags^=TNFLAGS_SICN;  /* Toggle Same Icon flag */
  1035.          GT_SetGadgetAttrs(dtcg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1036.          GT_SetGadgetAttrs(dfbg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1037.          GT_SetGadgetAttrs(dfsg,w,NULL,GA_Disabled,sicon,TAG_DONE);
  1038.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  1039.          break;
  1040.         case DTGAD_ID:          /* User selected the DockType gadget */
  1041.          cb->cb_Flags^=TNFLAGS_DDOB;  /* Toggle icon type flag */
  1042.          ActivateGadget(curg,w,NULL); /* Reactivate old string gadget */
  1043.          break;
  1044.         case DBGAD_ID:          /* User selected the DockFile button gadget */
  1045.          SetFileGadget(dfsg,DFileKey,FREQ_ICON);
  1046.          break;
  1047.         case DFGAD_ID:          /* User pressed <return> on DockFile gadget */
  1048.          SetAndActivateSG(alsg); /* Activate next gadget */
  1049.          break;
  1050.         case OKGAD_ID:          /* User selected the OK gadget */
  1051.          UWORD oldflags;
  1052.  
  1053.          /* Window in closing state or icon positioning in progress? */
  1054.          /* Yes --> Skip this event */
  1055.          if (clwin || DoPositioning) break;
  1056.  
  1057.          /* Copy new tool parameters */
  1058.          strcpy(cb->cb_Alias,
  1059.                 ((struct StringInfo *) alsg->SpecialInfo)->Buffer);
  1060.          strcpy(cb->cb_RealName,
  1061.                 ((struct StringInfo *) rnsg->SpecialInfo)->Buffer);
  1062.          strcpy(cb->cb_WorkDir,
  1063.                 ((struct StringInfo *) wdsg->SpecialInfo)->Buffer);
  1064.          strcpy(cb->cb_Path,
  1065.                 ((struct StringInfo *) pasg->SpecialInfo)->Buffer);
  1066.          strcpy(cb->cb_OutFile,
  1067.                 ((struct StringInfo *) ofsg->SpecialInfo)->Buffer);
  1068.          cb->cb_Stack=((struct StringInfo *) stig->SpecialInfo)->LongInt;
  1069.          strcpy(cb->cb_HotKey,
  1070.                 ((struct StringInfo *) hksg->SpecialInfo)->Buffer);
  1071.          strcpy(cb->cb_IconFile,
  1072.                 ((struct StringInfo *) ifsg->SpecialInfo)->Buffer);
  1073.          cb->cb_IconX=((struct StringInfo *) ixig->SpecialInfo)->LongInt;
  1074.          cb->cb_IconY=((struct StringInfo *) iyig->SpecialInfo)->LongInt;
  1075.          strcpy(cb->cb_DockFile,
  1076.                 ((struct StringInfo *) dfsg->SpecialInfo)->Buffer);
  1077.  
  1078.          DetachToolList(); /* Tool list will be changed */
  1079.  
  1080.          /* If the user hasn't changed it's position, the new icon will not
  1081.             appear at the choosen position if the old one is still there. */
  1082.          if (etn->tn_AppIcon)
  1083.           {
  1084.            RemoveAppIcon(etn->tn_AppIcon);
  1085.            etn->tn_AppIcon=NULL;
  1086.           }
  1087.  
  1088.          /* If the user has changed the tool type to DUMMY, we forget the
  1089.             previous state of the icon flag for real now */
  1090.          oldflags=cb->cb_Flags;
  1091.          if (cb->cb_Type==TNTYPE_DUMMY)
  1092.           cb->cb_Flags=TNFLAGS_MENU|TNFLAGS_DOBJ|TNFLAGS_DDOB;
  1093.  
  1094.          /* Build new ToolNode */
  1095.          if (AddToolNode(cb,etn->tn_DirLock))
  1096.           {
  1097.            /* New ToolNode was added at the end of list */
  1098.            struct ToolNode *tn=RemTail(&ToolList); /* Remove new node */
  1099.  
  1100.            /* Insert it after the old node */
  1101.            Insert(&ToolList,(struct Node *) tn,(struct Node *) etn);
  1102.  
  1103.            /* Update the HotKeys window */
  1104.            RefreshHotKeysWindow(etn,FALSE);
  1105.            RefreshHotKeysWindow(tn,TRUE);
  1106.  
  1107.            /* Remove old node */
  1108.            RemToolNode(etn);
  1109.  
  1110.            /* Now the new node has moved to same place in the list which was
  1111.               occupied by the old one. Therefore it appears in the same place in
  1112.               the config file. (But don't forget to save the new definition :-)
  1113.               The same should be done for the AppMenuItem, but there is no
  1114.               easy way to do this now... */
  1115.  
  1116.            clwin=TRUE;               /* Close window */
  1117.            ConfigChanged=TRUE;       /* Config changed */
  1118.           }
  1119.          else /* No new ToolNode created --> reactivate Alias gadget */
  1120.           {
  1121.            /* Restore old flags */
  1122.            cb->cb_Flags=oldflags;
  1123.  
  1124.            /* Let the old icon re-appear */
  1125.            if (etn->tn_Flags&TNFLAGS_ICON)
  1126.             etn->tn_AppIcon=AddAppIconA((ULONG) etn,NULL,
  1127.                             (cb->cb_Flags&TNFLAGS_NNAM)?"":etn->tn_Node.ln_Name,
  1128.                             MyMP,NULL,etn->tn_Icon,NULL);
  1129.  
  1130.            /* Beep the user and reactivate old string gadget */
  1131.            DisplayBeep(NULL);
  1132.            ActivateGadget(curg,w,NULL);
  1133.           }
  1134.  
  1135.          AttachToolList(); /* Tool list has changed */
  1136.          break;
  1137.         case CAGAD_ID:          /* User selected the cancel gadget */
  1138.          clwin=TRUE;            /* Close window */
  1139.          DoOldPosition();       /* Move icon to old position */
  1140.          break;
  1141.        }
  1142.       break;
  1143.     }
  1144.    GT_ReplyIMsg(msg);
  1145.   }
  1146.  
  1147.  if (clwin) CloseEditWindow();
  1148. }
  1149.